package com.zhu.classpath.entry.container;


import com.zhu.classpath.entry.base.Entry;
import com.zhu.classpath.entry.factory.EntryFactory;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

/**
 * java -cp "lib/a.jar;lib/b.jar;classes;." com.example.Main
 这个类路径包含 4 个部分：
 lib/a.jar
 lib/b.jar
 classes（编译后的目录）
 .（当前目录）
 JVM 必须 按顺序查找 com/example/Main.class：
 先在 a.jar 里找 → 找不到
 再在 b.jar 里找 → 找不到
 再在 classes 目录里找 → 找到了！
 这个“按顺序查找多个路径”的逻辑，就是 CompositeEntryContainer 的职责。
 CompositeEntryContainer采用扁平管理
 CompositeEntryContainer
 ├── DirEntry("classes")
 ├── JarEntry("lib/a.jar")      ← 由 lib/* 展开
 ├── JarEntry("lib/b.jar")      ← 由 lib/* 展开
 ├── JarEntry("lib/spring.jar") ← 由 lib/* 展开
 └── DirEntry("config")
 */
//复合条目聚合器
public class CompositeEntryContainer implements  Entry{

    private  List<Entry> entries;

    // 私有构造，由工厂方法调用
    private CompositeEntryContainer(List<Entry> entries) {
        this.entries = new ArrayList<>(entries);
    }

    // 静态工厂方法：从类路径字符串创建 CompositeEntryContainer
    public static CompositeEntryContainer creteCompositeEntryContainer(String pathList) {
        List<Entry> entries = new ArrayList<>();
        // ; (Windows) 或 : (Linux/Mac)
        String separator = System.getProperty("path.separator");
        //输入 "lib/*.jar:/app/classes" → 拆分为 ["lib/*.jar", "/app/classes"]。
        String[] paths = pathList.split(Pattern.quote(separator));

        for (String path : paths) {
            path = path.trim();
            if (path.isEmpty()) {
                continue;
            }
            entries.addAll(EntryFactory.createEntrys(path));
        }
        return new CompositeEntryContainer(entries);
    }

    @Override
    public InputStream readClass(String className) {
        for (Entry entry : entries) {
            InputStream is = entry.readClass(className);
            if (is != null) {
                return is;
            }
        }
        return null;
    }

}
